前言
很久以前,我就已经萌生了制作微光模型的想法。我的设想十分美好:自己设计绘制三视图,根据三视图建模,再导出模型 3D 打印头骨自制兽装。这其中的每一步要做好都不容易,更何况我都曾完全没有涉足。然而现在看来,我确实踏踏实实一步步做出来了,这不能不说实在是一件值得骄傲的事情。
其实早在今年 4 月 30 号,我的生日,我已经将微光模型的第一版做了出来。不知出于何种原因,我并没有将它分享出来。也许是我觉得他还不够完美。之后我继续将模型导出为 VRChat avatar 和 vTuber 形象。到这一步,我决定将模型完全完善到满意再分享。但是之后,由于临近期末周,以及朋友的一些玩笑话,我暂时搁置了模型打磨,并将重心转移到制作兽装上。
现在,兽装已经做好。然而我却不再有足够的耐心和时间来完善模型,甚至没能为他加一件披风。前几日《黑神话悟空》发售,我十分喜爱这部游戏,尤其喜欢创始人的一段话:走上西游路,比取到真经更重要。我知道,我经历了很多事情,它们中的大部分并没有达到完美。我并不想成为一个完美主义者。我更希望我的努力、我的成就能被大家看到。“越是贪图圆满,越是搜不干净。”
至少,权当做个学习笔记,万一之后想继续完善模型,可以参考这篇文章。我在这里会将主要步骤描述清楚,并尽可能通俗易懂地讲解每个部分的作用和原理,加上一点我遇到的问题和解决方法。结合具体操作的视频教程,相信完全不会的新手也可以做出和我一样的效果。
准备工作
Blender
大概是去年,我最早开始盘算学习建模的时候,在网上看到许多关于选择软件的建议。一些论调认为现在的主流工作流还是 Maya 等传统软件,Blender 与主流工作流衔接不好。然而,Blender 开源免费、轻量、综合、简单、社区活跃、插件丰富,对于个人创作者来说十分合适。对于我来说,我并不想之后去游戏公司给别人打工,Blender 无疑成了最好的选择。并且就在我用的这段时间里,Blender 更新了许多版本,发展潜力巨大。
不同版本 Blender 功能有差别,在查看教程时最好查看对应版本的教程。我使用的 Blender 版本为 4.0,较新,而中文网上信息较落后,甚至 Blender 官方中文文档也会出现错误。因此,我建议在学习时主要参考英文文档和视频教程,并灵活利用中文 QQ 群或 stackoverflow 等社区。
在学习建人物之前,建议先通过阅读文档和视频熟悉 Blender 的基础操作和功能,以及了解大致建模工作流程。雕刻建模与多边形建模不同,对新手来说应该先熟悉多边形建模。
建模包括白模、材质、纹理、着色器、骨骼、光照等等。我们并不是要在 Blender 中做动画,而是需要导出模型到其他地方,比如 VRChat 所用的 Unity 中。在游戏引擎中,有不同的环境、光照和适用于模型的着色器。因此,我们在 Blender 中主要需要做的是:制作白模、纹理绘制、绑定骨骼与权重和形状键。
三视图
正如画画需要参考图,建模也需要参考图。这里注意,建模所需的三视图和概念图不同。三视图是指模型的正、侧、顶正交视图,对应建模时的三个正交摄像机视角。这要求模型对应位置在视图中的投影平行,比如正视图与侧视图的肩处于同一高度,否则无法从三视图得到模型。
三视图建人物模型时一般是 T-pose。这便于建模和骨骼绑定。在导入模型到 Unity 时,也要求模型为 T-pose。
我的模型比较简单,因此我自己画了三视图。
VRChat
VRChat 基于 Unity 引擎,并且有官方引擎 SDK。若要导入模型到 VRChat,除了需要在 Unity 中制作 avatar,还需要先做一些准备工作:
- 你的账号需要摆脱访客身份才可以上传自己的模型。在游戏中活跃一段时间后,可以自动成为正式会员。
- 中国地区上传模型时会被墙,需要使用全局国外代理。
之后按照官方教程设置模型、着色器、形状键。
制作模型
3D 模型制作过程很难用文字描述,具体需要参考视频教程。建议跟随入门教程掌握了基本操作之后,再找一个专业的系列教程跟随操作。我看的教程主要是 VRChat 官方推荐的,其内容十分详细,包括低模、精细化、材质、骨骼、权重、形状键、上传 VRChat、导出 Vtuber 模型、加衣服等。
我不是专业的,因此并没有详细的技术细节,只简单记录我工作的大致流程和遇到的问题。基本上,跟着视频教程做,遇到问题 Google 一下、问社区、问 AI,基本没什么问题。
作为自学了一点的初学者,我对建模的感觉就像雕塑,需要耐心和经验;作为数学系的学生,我对建模的体会就像解决最优化问题,需要权衡质量和效率,这会在之后的工作中体现出来。(好的部分是,作为新手的我们还没有到需要卡常数的那一步)
常用快捷键
1、2、3 切换模式,e 挤出,s 缩放,r 旋转,k 切割,m 合并,f 填充,x 删除,o 选取相连项,Ctrl+r 环切等。
Ctrl+Shift+M 选取镜像
白模
先建低模再细分细化。头部比较精细,与身体分开制作。头部可与身体连接或分开。如果要连接,注意接合处上下的布线一致。
- 头部:根据三视图由点到线然后到面进行拟合,注意布线满足之后缝合线的需求。眼睛部分做圆盘与身体分开。头发可用贝塞尔曲线制作,略复杂。
- 身体:挤出圆柱拟合身形即可。手部略精细需要单独做。注意手肘等关节处适合绑定骨骼的布线。
注意以下影响模型质量的因素:
- 优化面数,减小渲染压力;
- 减少三角形,渲染得更平滑,方便布线;
- 不用 n-边形(五边及以上),防止不同模型文件格式转换时出现问题。(可以在统计中找到多边形,使用选择工具选取它们,简单的解决方式是将其三角化)
可以看到,我们需要解决面数和模型细节的最优化问题。优化你的布线,让复杂的地方精细起来,简单(或者不常看见)的地方面数少一点。
- blender 的对称功能并不好用,有时候会有莫名其妙的节点被固定住无法移动。建议使用镜像修改器,对称调整仅用于之后微调。
- 细分修改器可以使用,但不容易控制,我在制作 2.0 时并未使用。
- 尝试优化拓扑结构,可以自己钻研或者看教程。很重要,会影响之后骨骼绑定和贴图绘制。
- gret 插件可以帮助将不同的流形合并,用于制作风格化毛发。
UV 贴图
UV 展开是将模型的三维信息转化为二维图像。在 Blender 中,我们在 UV 编辑器中展开模型表面。展开后的 UV 贴图可以用来制作纹理。UV 的意思是表示二维的两个坐标轴。
简单来说,其实就是将物体的表面剪开,然后平摊到平面上。这个表面是有弹性的,可以适当拉伸和缩放。要回到三维,就是将展开图重新缝合起来,因此 UV 连接的地方叫做缝合线。如果你玩过 Minecraft,知道材质或皮肤文件是什么样,那其实就是纹理贴图,从二维到三维的映射即为 UV。
虽然可以拉伸,但我们还是希望所有地方(尤其是细节多的地方)的高斯曲率越小越好。可以预想,如果我们不加限制地地加缝合线,我们总可以将 UV 贴图的高斯曲率降得无限低。不幸的是,就像缝纫一样,缝合线并不是越多越好,缝合处可能导致渲染过渡不平滑等问题。因此,我们不仅要尽可能减少缝合线,还需要将缝合线隐藏在不引人瞩目或锐利的地方。这是需要解决的另一个最优化问题。
- 如果你想用 Photoshop 制作 UV 贴图,可能需要注意每一部分的 UV 整体一致。
- UV 其实可以重叠,重叠部分会读取相同的纹理,可以节省空间。比如眼睛正反面的 UV 可以正交投影到平行于眼睛的平面。
纹理绘制
材质是模型表面颜色的表现形式。材质决定了模型的外观、质感、材质属性等。比如,金属度会影响光照反射。其中,纹理是材质的重要内容,它体现了物体的固有色。作为人物模型,纹理绘制是我们的重点。
在实际操作中,很多阴影、高光、凹凸等细节如果改模型和渲染会耗费很多资源,但其实这些细节人眼并不易察觉,且并不会随着环境改变太多。因此,在纹理绘制中,除了表现物体的固有色,还会将这些细节的直接呈现效果表现出来。
作为动漫人物模型,我们需要达到的是三渲二的效果。因此,我们需要在“着色”工作面板用节点将纹理图片直接映射到模型表面,以去除环境和光照的影响。直接将图片连到输出即可。
节点是材质纹理和着色器风格化的关键步骤,通常这部分的设置对新手来说不符合直觉,需要多练习。但三渲二的效果恰巧比较简单,于是并未深入研究。
以下是一些要点和遇到的问题:
- 贴图大小一般为边长 2 的整数次幂的正方形,如 512、1024 等。我用的是 2048x2048。格式为 PNG。贴图文件是独立于模型文件的,请务必注意保存,快捷键 Alt+S。
- Blender 有自带的纹理绘制工具,但功能比较简单。可以通过装插件实现包括图层在内的复杂功能。如果你仍然觉得工具不够用,可以尝试使用 Photoshop 等软件绘制纹理(因为贴图文件是独立的),此时你就会注意到 UV 展开每个部分整体性的重要性。
- 纹理绘制时需要留出足够的出血,使其覆盖 UV 范围,否则边缘容易出现错误。
查看变换的色彩管理会影响颜色。为了得到一致的结果,它应该被设置为 标准。
- 如果你需要将材质变为透明的(如添加表情),不能直接将图片连到输出,需要在着色器编辑器中添加透明 BSDF 节点和混合着色器节点,并用图片的 Alpha 通道作为系数输出材质。
骨骼与权重
现在你有了一个很自信地站着的人物,但是却死气沉沉的,看着像加载出错的样子。我们得让它动起来。
模型要靠骨骼才能动起来。骨骼的结构类似一颗有根树,每一根骨头有其父节点(骨头),祖先骨头的移动会连带子骨头一起移动,这意味着每个骨头的位置和角度信息其实是相对于其父骨头的。这很符合常理:你保持头与脊柱平行,弯下腰,头会随着身体一起向下移动,而不是停留在原地(哈哈)。如果你的头真的停留在原地,那么说明你的骨骼没设定好父级或者更权重没刷好。
权重是什么?权重其实是一个统称,在这里特指骨骼权重。注意,我们是看不见骨骼的,我们能看到的、我们的目的是网格的移动。网格是跟随骨骼移动的,你可以将骨头看做它附近网格的父亲,我们将网格的移动依附在骨头上,这样,我们只需要控制骨头就可以控制其附近网格进行相同的位移旋转。那么具体这个骨头控制网格的哪些节点、控制多少呢?这就需要给网格赋予权重了。
选择一个骨头,在权重模式中给你希望它控制的网格刷上权重。刷的越多,骨头的移动对节点移动的影响越大。注意,一个节点的在各个骨头上的权重之和应该是 100%,否则它将部分保持绝对坐标。具体操作中,你可以给人物摆出一些很夸张的动作,以检查权重是否正确。
如果你之后想添加衣物,衣物同样需要绘制权重绑定到骨骼上。
- 我两次遇到了无法在权重绘制时选择骨骼的问题。在 Blender 4.0 后,操作为先选择骨骼,Shift 加选网格,在权重绘制模式中按 Ctrl+Shift+LMB 即可。
- 如果网格受骨骼影响很生硬,那大概是因为有些节点只有单一权重或没有权重。网格的最终权重是将所有骨骼的权重归一化。因此查看网格是否的确被多个骨骼影响。
形状键
骨骼方便其他程序比如游戏控制我们的人物肢体,然而我们仍然需要一些细节的固定动作。比如做表情时,人物的五官会有不同的位移,这时骨骼就不太好用了。这些比较固定的动作可以用形状键来实现。
形状键使用方法也十分简单。对每一个网格,创建一个形状键(会自动创建基础形状键),然后将网格各个节点移动为你想要的形状,可以设定 $0-1$ 以内的值来。由于形状键是平滑过渡的,你甚至可以控制权重为中间过程。结合多种形状键,可以创造出多个组合动作。事实上,Blender Cats 插件给出不同音的唇形就是依靠这种方法:只需给出 AH OH CH 三个音的唇形就可以组合出几乎所有发音的唇形。你也可以利用这一点来做出新的表情。
制作动漫人物可能会需要一些表情贴图,直接用网格做,平时缩小隐藏在头内部,使用形状键时放大调出来即可。
网格-从形态键混合
可以快速地从已有形态键得到新的形态键。
如果你想制作的表情为基础表情的组合(如害怕表情可为眼睛缩小瞳孔+面部悲伤),你无需将所有表情用形态键捏出来(不同网格的形态键也不互通)——在导入 Unity 后,会重新设置表情选项,那时可以用多个动画(形状键,骨骼)来实现复杂的表情。
至此,制作模型的基本流程全部完成。可导出为各种不同格式。
导入 Unity
Unity 是 VRChat 所用的游戏引擎,我们需要将模型导出为 .fbx
文件再导入 Unity 中。
Unity 是一个游戏引擎,因此它有自己的一套逻辑,为游戏场景服务,模块很多。但是我们只需要导入一个角色到场景中,因此如果不是对引擎很感兴趣,这边建议跟随教程操作,否则会出现不可预料的错误。
- 如果你遇到了模型形态键丢失的情况,查看是否在 blender 中给网格应用了所有修改器。我曾保留了一个空的数据传递修改器,导致形状键丢失。
- 在重复导入 .fbx 文件时,请务必确定导出时的参数一致:选择对 .fbx 应用变换,以避免单位不统一导致的缩放问题。(如果你覆盖资源时发现变换乘了100,通常是这个问题导致的)
导入模型
导入材质
添加动画
可以给模型添加动画,包括自己设计的和导入网上下载的。
添加动画时,如果是不影响 humaniod 部分的骨骼,可以进行 transform 变换。但请注意:添加了VRC物理骨骼的骨头无法进行transform。如果你这样做了,在动画预览中会显示正常,但是在 VRC 中会失效。因为脚本是在运行后执行的。